/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2022-08-13
 * Time: 16:33
 */

//extends 继承关键字
//子类继承父类之后，必须要新添加自己特有的成员，体现出与基类的不同

class Dogdog extends Animal {

    float x = 3.14f;
    int a = 10;

    public void barked() {
        System.out.println(name + " 在狗叫");
    }

    public void fundog1() {
        System.out.println("这是子类中自己得方法fundog1");
    }

    public void fundog2() {
        //成员方法不同名时，在子类方法中或通过子类对象访问成员方法时，优先访问子类自己得，没有在访问父类得
        System.out.println("这是子类中调用父类得一个方法fundog2");
        fundog1();//调用子类自己得方法
        fun(); //调用父类
    }

}

class Cat extends Animal {

    float x = 6.66f;

    int b = 20;

    public void mew() {
        System.out.println(name + " 在猫叫");
    }

    public void funA() {
        System.out.println("这是cat类中得方法funA");
    }

    public void funB() {
        System.out.println("这是cat类中得方法funB");
    }

    //子类访问父类中得成员变量包括方法，都是就近原则，子类中有优先访问没有访问父类

    public void funC() {
        funA(); //子类中访问父类得同名方法（且类型一致不构成重载），优先访问子类自己得，没有在访问父类得 --此处为子类自己得
        funA(10); //子类中没有带参数得方法funA，访问父类中得  -- 此处为父类得带参得
        funB();//子类中访问子类和父类中都有同名方法（且不构成重载），永远都是访问子类得  --此处为子类自己得
    }
}

//父类-超类-基类
class Animal {

    double x = 8.13;
    int a = 30;
    int b = 40;
    public String name;
    public int age;

    public void fun() {
        System.out.println("这是一个父类中得方法fun");
    }

    public void eat() {
        System.out.println(name + " 在吃饭");
    }

    public void funA(int a) {
        System.out.println("这是父类中得方法funA（int）");
    }

    public void funB() {
        System.out.println("这是父类中得方法funB");
    }
}

public class Test_0813 {

    public static void main(String[] args) {
        Dogdog dog = new Dogdog();
        Cat cat = new Cat();

        //dog 继承了父类中Animal得姓名和年龄 可以直接通过对象点引用
        System.out.println(dog.name);
        System.out.println(dog.age);
        System.out.println(dog.a); //子类中和父类中都有得同名（且类型相同）成员变量，优先访问子类自己得 10
        System.out.println(dog.b); //子类中没有 b 这个成员变量，从父类中继承而来 40
        System.out.println(dog.x); //子类中和父类都有同名得成员变量，优先访问子类自己得 3.14
        dog.eat();
        //dog 中独有得方法
        dog.barked();
        //dog子类中调用父类和自己得不同名成员方法
        dog.fundog2();
        System.out.println("================");

        //cat 继承了父类中Animal得姓名和年龄 可以直接通过对线点引用
        System.out.println(cat.name);
        System.out.println(cat.age);
        System.out.println(cat.b); //子类中和父类中都有得同名（且类型相同）成员变量，优先访问子类自己得 20
        System.out.println(cat.a); //子类中没有 a 这个成员变量，从父类中继承而来 30
        System.out.println(cat.x); //子类中和父类有同名得成员变量，优先访问子类自己得 6.66
        cat.eat();
        //cat 中独有得方法
        cat.mew();
        //cat中子类调用父类和自己同名得成员方法、
        cat.funC();
    }
}
